#pragma once 

#include "poller.h"
#include <sys/epoll.h>

/**
 * epoll_create
 * 
 * epoll_ctl  添加感兴趣的事件
 * epoll_wait 
 * 
 * 
 * EPollPoller
 * 这个类的作用  
 *    1 对Channel的操作（注册，删除，更新）， 相当于对epoll_ctl的封装
 *    2 poll对 epoll_wait 封装
 */
class EPollPoller : public Poller{
public:
    TimeStamp poll(int timeout, ChannelList* activateChannels) override;
    void updateChannel(Channel* channel) override;
    void removeChannel(Channel* channel) override;

    EPollPoller(EventLoop * eventloop);
    ~EPollPoller () override;

private:
    using EventList = std::vector<epoll_event>;
    static const int kInitEventListSize = 16;

    // 填写活跃的连接
    void fillActivateChannels(int numEvents, ChannelList* activateChannels) const;
    void update(int, Channel*);
    // 这个是epoll对应的fd
    int epollfd_;
    // 这个是epll_wait 的传出参数
    EventList events_;
};